package com.jh.fcsm.common.redis;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {

    public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

    private final Class<T> clazz;

    public FastJson2JsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);

        return JSON.parseObject(str, clazz);
    }

    /**
     * 把Json转换为List
     */
    @SuppressWarnings("unchecked")
    public List<T> deserializeList(byte[] bytes) {
        List<T> result = new ArrayList<T>();

        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);

        JSONArray ja = JSON.parseArray(str);
        if (ja == null) {
            return result;
        }
        for (int i = 0; i < ja.size(); i++) {
            T vo = (T) ja.getJSONObject(i);
            result.add(vo);
        }
        return result;
    }

    /**
     * 将List转换为Json
     */
    public byte[] serializeJson(List<T> list) {
        byte[] bytes = JSON.toJSONString(list).getBytes(DEFAULT_CHARSET);
        return bytes;
    }

}
